Fourier Demos with Audio

In [116]:
import numpy as np
from IPython.display import Audio
import scipy.io.wavfile
import matplotlib.pyplot as plt
%matplotlib inline
from numpy.fft import fft, ifft, fft2, ifft2, fftshift, ifftshift
#from scipy import ndimage, misc
from scipy.signal import gaussian
from joSigProc import *

Examples of Frequency Modulation (filtering)

Frequency Filtering in Music

In [117]:
# Widening filter on voice
Omega, f = scipy.io.wavfile.read('Stamp.wav')
Audio(f[15*Omega:32*Omega,0], rate=Omega)
#scipy.io.wavfile.write('Stamp_15-32.wav', Omega, f[15*Omega:32*Omega,0])
Out[117]:
In [134]:
Omega, f = scipy.io.wavfile.read('Stamp.wav')
f1 = f[32*Omega:42*Omega,0]
N = len(f1)
g1 = FilterSignal(f1, 0.1*N, band='low')
PlotFT(f1, Omega, fig=1, color='0.75')
PlotFT(g1, Omega, fig=1, clf=False)
Audio(g1, rate=Omega)
Out[134]:
In [135]:
Omega, f = scipy.io.wavfile.read('Stamp.wav')
f1 = f[32*Omega:42*Omega,0]
N = len(f1)
g1 = FilterSignal(f1, 0.1*N, band='high')
PlotFT(f1, Omega, fig=1, color='0.75')
PlotFT(g1, Omega, fig=1, clf=False)
Audio(g1, rate=Omega)
Out[135]:
In [122]:
# Narrowing filter on banjo
Omega, f = scipy.io.wavfile.read('TwoHeads.wav')
Audio(f[25*Omega:37*Omega,0], rate=Omega)
Out[122]:

Separating components

In [123]:
ff = f[150*Omega:165*Omega,0].copy()
PlotSignal(ff, Omega)
Audio(ff, rate=Omega)
Out[123]:
In [124]:
FF = np.fft.fftshift(np.fft.fft(ff))
shifted_omega = ShiftedFreqSamples(ff, Omega)
PlotFT(ff, Omega);
In [125]:
T = 600
G = FF.copy()
G[abs(shifted_omega)>T] = 0.
plt.figure(1); plt.clf()
PlotFT_raw(shifted_omega, abs(G), color='r');
In [126]:
g_low = np.real(ifft(ifftshift(G)))
g = g_low
Audio(np.real(g), rate=Omega)
Out[126]:
In [127]:
T = 1000
G = FF.copy()
G[abs(shifted_omega)<T] = 0.
PlotFT_raw(shifted_omega, abs(G), fig=1, clf=False)
g_high = np.real(ifft(ifftshift(G)))
g = g_high
Audio(np.real(g), rate=Omega)
Out[127]:

Frequency Shifting

In [128]:
Omega, f = scipy.io.wavfile.read('handel.wav')
F = fftshift(fft(f))
shifted_omega = ShiftedFreqSamples(f, Omega)
t = TimeSamples(f, Omega)
#shifted_omega = ShiftedFreqSamples(f, Omega)
print('Sampling rate is '+str(Omega)+' Hz')
print('Number of samples is '+str(np.shape(f)))
plt.plot(shifted_omega, (abs(F)))
plt.title('Frequency Domain')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Modulus');
Audio(f, rate=Omega)
Sampling rate is 8192 Hz
Number of samples is (73113,)
Out[128]:

Shift a bunch of Fourier coefficients

In [129]:
from copy import deepcopy
Fshift = deepcopy(F)
tau_1 = 100
tau_2 = 1200
shift_Hz = 200
L = t[-1]
shift = int(shift_Hz*L)
print(shift)
1784
In [130]:
idx1 = list(shifted_omega>=tau_1).index(True)
idx2 = list(shifted_omega<tau_2).index(False)
In [131]:
idx = np.arange(idx1,idx2)
Fshift[idx+shift] = F[idx]
In [132]:
g = ifft(ifftshift(Fshift))
Audio(np.real(g), rate=Omega)
Out[132]:
In [ ]: